package reflect;

import jdk.nashorn.internal.codegen.MethodEmitter;

import java.lang.reflect.Method;
import java.util.Scanner;

/*
* java反射机制
* 反射机制是java的动态机制，没有它就没有如今这么多java框架
* 反射机制允许我们在程序 运行期间 在确定对象的实例化，方法的调用，属性的操作等
* 这使得程序的灵活度大大的提高，但是随之也带来的更多的开销和较慢的运行效率
* 因此反射机制也不能被过度依赖
* */
public class reflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        //获取一个类对象(类对象是全局每个类有且只有的一个的 不要和实例的意思弄混)

        //1.通过类名.class获取类对象
        //Class cls = String.class;   //获取String类的类对象

        //2.Class.forName("完全限定名 包名.类名")
        //Class cls = Class.forName("java.long.String");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类的完全限定名");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);




        String name = cls.getName();    //获取到 类对象 的完全限定名 包名.类名
        System.out.println(name);
        name = cls.getSimpleName(); //仅获取类对象的类名
        System.out.println(name);
        //获取包名
        String packName = cls.getPackage().getName();
        System.out.println(packName);
        /*
        * Method类 方法对象
        * Method的每一个实例用于表示某个类中的某个特定方法
        * */
        //通过类对象获取一个类中的所有公开方法
        Method[] m = cls.getMethods();
        System.out.println(name+"类:共有"+m.length+"个公开方法");
        for (Method method : m){
            System.out.println(method.getName());
        }
    }
}
